import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


/**
 * 将 表白墙 引入数据库
 * 1. 引入 mysql 驱动包 --》中央仓库--》mysql--》pom.xml 引入
 *
 */

/**
 * 使用 JDBC 基本流程
 * 1.创建数据源
 * 2.和数据库建立链接
 * 3.构造 sql 语句
 * 4.执行 sql 语句
 * 5.如果是查询语句，需要遍历结果集，如果是插入/删除/修改，则不需要
 * 6.关闭连接，释放资源
 */

// 客户端 给服务器提交一条留言，从POST请求中把 body 部分获取到，并转成一个类
class Message2 {
    public String from;
    public String to;
    public String message;
}

// 约定前后端交互接口
@WebServlet("/message2")
public class MessageServlet2  extends HttpServlet {

    // 创建一个 json 对象
    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 处理消息列表

        // readValue json格式的字符串 转换为 java字符串  第一个参数对那个字符串进行 第二个参数表示把这个 json 格式的字符串转为 java 对象
        Message message = objectMapper.readValue(req.getInputStream(),Message.class);



        // 通过 ContentType 来告知页面，返回的数据是 json 格式
        // 有了这样的声明，此时 jquery ajax 就会自动的帮我们把字符串转成 js 对象
        // 如果没有，jquery ajax 就只是当成字符串来处理

        save(message);
        resp.setContentType("application/json;charset=utf8");


        resp.getWriter().write("{\"ok\": true}");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获得到消息列表  只要把消息列表中的内容 整个都返回到客户端即可
        // 此处需要使用 ObjectMapper 把 java 对象，转成 JSON 格式字符串

        List<Message> messages = load();
        String jsonString = objectMapper.writeValueAsString(messages);
        resp.setContentType("application/json;charset=utf8");
        System.out.println(" jsonString " + jsonString);

        resp.getWriter().write(jsonString);
    }


    private void save(Message message) {
        // 把一条消息存到数据库中
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            // 1. 和数据库建立链接

            connection = DBUtil.getConnection();

            // 2. 构造 SQL
            String sql = "insert into message values(?,?,?)";

            statement.setString(1,message.from);
            statement.setString(2,message.to);
            statement.setString(3,message.message);
            // 3. 执行 SQL
            statement.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            DBUtil.close(connection,statement,null);
        }

    }

    private  List<Message> load(){
        // 从数据库中 获取到所有的消息
        List<Message> messages = new ArrayList<Message>();
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;

        try {
            connection = DBUtil.getConnection();
            String sql ="select * from message";
            statement = connection.prepareStatement(sql);
            resultSet = statement.executeQuery();
            while (resultSet.next()) {
                Message message = new Message();
                message.from = resultSet.getString("from");
                message.to = resultSet.getString("to");
                message.message = resultSet.getString("message");
                messages.add(message);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            DBUtil.close(connection,statement,resultSet);
        }
        return messages;

    }
}
